 //
///Feel free to use this plugin to practive and improve
//your critical listening.
//
///I recommend the reading and listeing of Dave Moulton's 
//Golden Ears (http://www.moultonlabs.com/full/product01)
//which inspired me to make this little plugin.
//
///Finally, thanks to the Cockos team for this incredible
//powerful DAW without limits.
//
/////Spyrow.
//
//
//PS: If you find any bug send me a PM at Cockos Forums.
//PS2: The filter is borrowed from the Parametric_EQ plugin:
//// Parametric EQ JS plugin.
//// Copyright (C) 2004 and on, Cockos Inc.
//// License: GPL
//


desc: Spyrow's Ear training for Mixing Engineers

slider1: 0<0,1,1{1 Octave,1/3 Octave}> Bandwidth
slider2: 0<0,1,1{-,32 Hz,63 Hz,125 Hz,250 Hz,500 Hz,1000 Hz,2000 Hz,4000 Hz,8000 Hz,16000 Hz}> Minimum Frequency 1 Octave
slider3: 0<0,1,1{-,32 Hz,63 Hz,125 Hz,250 Hz,500 Hz,1000 Hz,2000 Hz,4000 Hz,8000 Hz,16000 Hz}> Maximum Frequency 1 Octave
slider4: 0<0,1,1{-,25 Hz,31 Hz,40 Hz,50 Hz,63 Hz,80 Hz,100 Hz,125 Hz,160 Hz,200 Hz,250 Hz,315 Hz,400 Hz,500 Hz,630 Hz,800 Hz,1000 Hz,1250 Hz,1600 Hz,2000 Hz,2500 Hz,3150 Hz,4000 Hz,5000 Hz,6300 Hz,8000 Hz,10000 Hz,12500 Hz,16000 Hz,20000 Hz}> Minimum Frequency 1/3 Octave
slider5: 0<0,1,1{-,25 Hz,31 Hz,40 Hz,50 Hz,63 Hz,80 Hz,100 Hz,125 Hz,160 Hz,200 Hz,250 Hz,315 Hz,400 Hz,500 Hz,630 Hz,800 Hz,1000 Hz,1250 Hz,1600 Hz,2000 Hz,2500 Hz,3150 Hz,4000 Hz,5000 Hz,6300 Hz,8000 Hz,10000 Hz,12500 Hz,16000 Hz,20000 Hz}> Maximum Frequency 1/3 Octave
slider6: 0<0,1,1{Both,Boost only,Cut only}>Boost or Cut?
slider7: -12<-18,-3,2.5>Minimum cut (dB)
slider8: -12<-18,-3,2.5>Maximum cut (dB)
slider9: 12<3,18,2.5>Minimum boost (dB)
slider10: 12<3,18,2.5>Maximum boost (dB)
slider11: 5<0,10,1>Auto Timing (0 seconds = Manual)
slider12: 0<0,1,1{-,No,Yes}>Bypass EQ (only with manual timing)
slider13: 0<0,1,1{Not yet,Yes}>Let's start?
slider14: 0<0,1,1{-,Not yet,Yes please}>Show the solution?
slider15: 0<0,1,1{-,Not yet,Yes please}>Reset the riddle?
slider16: 0<0,1,1{-,Not yet,Yes please}>Listen again? (only with auto timing)

@init
ext_noinit = 1;
slider2 = 1;
slider3 = 10;
sliderchange(slider2);
sliderchange(slider3);
timing = 0;
reset = 0;
show = 0;
bypass = 0;
auto = 0;
octave = 0;

a[31] = 0;
a[32] = 32;
a[33] = 63;
a[34] = 125;
a[35] = 250;
a[36] = 500;
a[37] = 1000;
a[38] = 2000;
a[39] = 4000;
a[40] = 8000;
a[41] = 16000;

b[0] = 0;
b[1] = 25;
b[2] = 31;
b[3] = 40;
b[4] = 50;
b[5] = 63;
b[6] = 80;
b[7] = 100;
b[8] = 125;
b[9] = 160;
b[10] = 200;
b[11] = 250;
b[12] = 315;
b[13] = 400;
b[14] = 500;
b[15] = 630;
b[16] = 800;
b[17] = 1000;
b[18] = 1250;
b[19] = 1600;
b[20] = 2000;
b[21] = 2500;
b[22] = 3150;
b[23] = 4000;
b[24] = 5000;
b[25] = 6300;
b[26] = 8000;
b[27] = 10000;
b[28] = 12500;
b[29] = 16000;
b[30] = 20000;

// For parametric EQ
c0=c1=c2=0;
ldelay1=ldelay2=rdelay1=rdelay2=0;
li1=li2=ri1=ri2=0;
width_1 = 1.5;
width_13 = 0.5;

@slider
(slider1 == 1) && (octave == 0) ? (
  slider2 = 0;
  slider3 = 0;
  slider4 = 1;
  slider5 = 30;
  octave = 1;
);

(slider1 == 0) && (octave == 1) ? (
  slider2 = 1;
  slider3 = 10;
  slider4 = 0;
  slider5 = 0;
  octave = 0;
);
slider7 < slider8 ? slider8 = slider7;
slider9 > slider10 ? slider10 = slider9;
slider3 < slider2 ? slider3 = slider2;
slider5 < slider4 ? slider5 = slider4;

(slider11 == 0) && (timing == 0) ? (
  slider12 = 1;
  timing = 1;
);

(slider11 > 0) && (timing == 1) ? (
  slider12 = 0;
  timing = 0;
);

(slider13 == 1) && (show == 0) ? (
  slider14 = 1;
  show = 1;

//1 Octave Random
octave == 0 ? (
  num_oct = slider3 - slider2+1;
  while (
    oct_freq = floor(rand(num_oct+1));
    oct_freq == 0;
);
  oct_freq = oct_freq + slider2 - 1;
  oct = a[oct_freq+31];
);

//1/3 Octave Random
octave == 1 ? (
  num_oct = slider5 - slider4+1;
  while (
    oct_freq = floor(rand(num_oct+1));
    oct_freq == 0;
);
  oct_freq = oct_freq + slider4 - 1;
  oct = a[oct_freq];
);

//Boost&Cut Random

while (
  cut = (floor(rand(6))+1)*3;  
  cut = -cut;
  (cut > slider7) || (cut < slider8);
);

while (
  boost = (floor(rand(6))+1)*3;  
 (boost > slider10) || (boost < slider9);
);

slider6 == 0 ? (
  rand(2) < 1 ? bnc = boost : bnc = cut;
) : slider6 == 1 ? bnc = boost : bnc = cut;

//NOW THE FILTER

octave == 0 ? width = width_1 : width = width_13;

arc=oct*$pi/(srate*0.5);
gain=(2 ^ (bnc/6));
x=(sin(arc)*width) * (gain < 1 ? 1 : 0.25);
tmp=1/(1+x);  
c0=tmp*x*(gain-1);
c1=tmp*2*cos(arc);
c2=tmp*(x-1);

//NOW THE BYPASS AND TIMING

slider11 == 0 ? bypass = 1 :  auto = buffer = 1;

);

(slider14 == 2) && (reset == 0) ? (
  slider15 = 1;
  reset = 1;
);

slider15 == 2 ? (
  slider13 = 0;
  slider14 = 0;
  slider15 = 0;
  reset = 0;
  show = 0;
  bypass = 0;
  slider11 == 0 ? slider12 = 1 : slider12 = 0;
  auto = 0;
  slider16 = 0;
);

(slider11 == 0) && (slider13 == 1) && (slider12 == 2) ? bypass = 0;
(slider11 == 0) && (slider13 == 1) && (slider12 == 1) ? bypass = 1;

(slider16 == 2) && (slider13 == 1) && (slider11 != 0) ? auto = buffer = 1;



@gfx 100 10
gfx_x=gfx_y=5;
gfx_lineto(gfx_x, gfx_y,0);
gfx_r=gfx_b=0;
gfx_g=gfx_a=1;

slider13 == 0 ? (
gfx_drawchar($'U');
gfx_drawchar($'s');
gfx_drawchar($'e');
gfx_drawchar($' ');
gfx_drawchar($'"');
gfx_drawchar($'L');
gfx_drawchar($'e');
gfx_drawchar($'t');
gfx_drawchar($'s');
gfx_drawchar($' ');
gfx_drawchar($'s');
gfx_drawchar($'t');
gfx_drawchar($'a');
gfx_drawchar($'r');
gfx_drawchar($'t');
gfx_drawchar($'"');
gfx_drawchar($' ');
gfx_drawchar($'t');
gfx_drawchar($'o');
gfx_drawchar($' ');
gfx_drawchar($'s');
gfx_drawchar($'t');
gfx_drawchar($'a');
gfx_drawchar($'r');
gfx_drawchar($'t');
gfx_drawchar($'.');
) : (
slider14 == 1 ? (
gfx_drawchar($'N');
gfx_drawchar($'o');
gfx_drawchar($'w');
gfx_drawchar($' ');
gfx_drawchar($'t');
gfx_drawchar($'r');
gfx_drawchar($'y');
gfx_drawchar($' ');
gfx_drawchar($'t');
gfx_drawchar($'o');
gfx_drawchar($' ');
gfx_drawchar($'g');
gfx_drawchar($'u');
gfx_drawchar($'e');
gfx_drawchar($'s');
gfx_drawchar($'s');
gfx_drawchar($'.');
gfx_drawchar($'.');
gfx_drawchar($'.');

bypass == 1 ? (
gfx_drawchar($' ');
gfx_drawchar($'(');
gfx_drawchar($'E');
gfx_drawchar($'Q');
gfx_drawchar($' ');
gfx_drawchar($'a');
gfx_drawchar($'c');
gfx_drawchar($'t');
gfx_drawchar($'i');
gfx_drawchar($'v');
gfx_drawchar($'e');
gfx_drawchar($')');
);

slider11 == 0 ? (
gfx_x = 5;
gfx_y = 25;
gfx_drawchar($'M');
gfx_drawchar($'a');
gfx_drawchar($'n');
gfx_drawchar($'u');
gfx_drawchar($'a');
gfx_drawchar($'l');
gfx_drawchar($' ');
gfx_drawchar($'t');
gfx_drawchar($'i');
gfx_drawchar($'m');
gfx_drawchar($'i');
gfx_drawchar($'n');
gfx_drawchar($'g');
gfx_drawchar($':');
gfx_drawchar($' ');
gfx_drawchar($'p');
gfx_drawchar($'l');
gfx_drawchar($'e');
gfx_drawchar($'a');
gfx_drawchar($'s');
gfx_drawchar($'e');
gfx_drawchar($' ');
gfx_drawchar($'u');
gfx_drawchar($'s');
gfx_drawchar($'e');
gfx_drawchar($' ');
gfx_drawchar($'t');
gfx_drawchar($'h');
gfx_drawchar($'e');
gfx_drawchar($' ');
gfx_drawchar($'b');
gfx_drawchar($'y');
gfx_drawchar($'p');
gfx_drawchar($'a');
gfx_drawchar($'s');
gfx_drawchar($'s');
gfx_drawchar($' ');
gfx_drawchar($'t');
gfx_drawchar($'o');
gfx_drawchar($' ');
gfx_drawchar($'c');
gfx_drawchar($'o');
gfx_drawchar($'m');
gfx_drawchar($'p');
gfx_drawchar($'a');
gfx_drawchar($'r');
gfx_drawchar($'e');
gfx_drawchar($'.');

);

) : (
gfx_drawchar($'T');
gfx_drawchar($'h');
gfx_drawchar($'e');
gfx_drawchar($' ');
gfx_drawchar($'s');
gfx_drawchar($'o');
gfx_drawchar($'l');
gfx_drawchar($'u');
gfx_drawchar($'t');
gfx_drawchar($'i');
gfx_drawchar($'o');
gfx_drawchar($'n');
gfx_drawchar($' ');
gfx_drawchar($'i');
gfx_drawchar($'s');
gfx_drawchar($':');
gfx_drawchar($' ');
gfx_drawnumber(bnc,0);
gfx_drawchar($' ');
gfx_drawchar($'d');
gfx_drawchar($'B');
gfx_drawchar($' ');
gfx_drawchar($'a');
gfx_drawchar($'t');
gfx_drawchar($' ');
gfx_drawnumber(oct,0);
gfx_drawchar($' ');
gfx_drawchar($'H');
gfx_drawchar($'z');

bypass == 1 ? (
gfx_drawchar($' ');
gfx_drawchar($'(');
gfx_drawchar($'E');
gfx_drawchar($'Q');
gfx_drawchar($' ');
gfx_drawchar($'a');
gfx_drawchar($'c');
gfx_drawchar($'t');
gfx_drawchar($'i');
gfx_drawchar($'v');
gfx_drawchar($'e');
gfx_drawchar($')');
);

gfx_x = 5;
gfx_y = 25;
gfx_drawchar($'P');
gfx_drawchar($'l');
gfx_drawchar($'e');
gfx_drawchar($'a');
gfx_drawchar($'s');
gfx_drawchar($'e');
gfx_drawchar($' ');
gfx_drawchar($'u');
gfx_drawchar($'s');
gfx_drawchar($'e');
gfx_drawchar($' ');
gfx_drawchar($'"');
gfx_drawchar($'R');
gfx_drawchar($'e');
gfx_drawchar($'s');
gfx_drawchar($'e');
gfx_drawchar($'t');
gfx_drawchar($'"');
gfx_drawchar($' ');
gfx_drawchar($'f');
gfx_drawchar($'o');
gfx_drawchar($'r');
gfx_drawchar($' ');
gfx_drawchar($'a');
gfx_drawchar($' ');
gfx_drawchar($'n');
gfx_drawchar($'e');
gfx_drawchar($'w');
gfx_drawchar($' ');
gfx_drawchar($'r');
gfx_drawchar($'i');
gfx_drawchar($'d');
gfx_drawchar($'d');
gfx_drawchar($'l');
gfx_drawchar($'e');
gfx_drawchar($'.');

);
);


@sample

auto == 1 ? (

buffer = buffer + 1;
buffer < srate*slider11 ? bypass = 1 : (
  bypass = auto = 0;
  slider16 = 1;
);
);

bypass != 0 ? (
tmp=c0*(spl0-ldelay2) + c1*li1 + c2*li2;
ldelay2=ldelay1; ldelay1=spl0; 
li2=li1; spl0 += (li1=tmp);
tmp=c0*(spl1-rdelay2) + c1*ri1 + c2*ri2;
rdelay2=rdelay1; rdelay1=spl1; 
ri2=ri1; spl1 += (ri1=tmp);
);

